<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<META content="text/html; charset=ISO-8859-2" http-equiv="content-type">
<meta name="robots" content="index,follow">
<META NAME="Keywords" CONTENT="HTML, unordered list, nested list, HTML list generator">
<meta name="viewport" content="width=device-width, initial-scale=1">
<META NAME="Author" CONTENT="Tomasz Ostrowski">
<META name="description" content="Text to nested unordered HTML list converter">  
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 959px)" href="./css/mobile.css" />
<link rel="stylesheet" type="text/css" media="only screen and (min-width: 960px)" href="./css/main.css" />
<script type="text/javascript" src="./js/tree.js"></script>


<script src="./js/jquery-2.1.3.min.js"></script>
<!-- <link rel="stylesheet" type="text/css" href="./css/jquery-eu-cookie-law-popup.css"/>
<script src="./js/jquery-eu-cookie-law-popup-en.js"></script> -->

<title>Text -> nested unordered HTML list converter</title>  
</head>
<body class="eupopup eupopup-bottomleft eupopup-style-compact">

<div id="wrap">
<div id="header">
<div id="header_l">
  <a href="../index.htm">erma0.cn</a>
</div>
<div id="header_r"><A HREF="./html_list_gen.htm" TARGET="_self"><strong>ENGLISH VERSION</strong></A><br><A HREF="./html_list_gen.php?lang=pl" TARGET="_self"><strong>WERSJA POLSKA</strong></A></div>      
</div>

<a href="../bot-trap/">
  <img src="./images/pixel.gif" border="0" alt=" " width="1" height="1">
</a>
     

    <script type="text/javascript">
//<!--

        function insertAtCursor(myField, myValue) {
          //IE support
          if (document.selection) {
            myField.focus();
            sel = document.selection.createRange();
            sel.text = myValue;
          }

          //MOZILLA/NETSCAPE support
          else if (myField.selectionStart || myField.selectionStart == '0') {
            var startPos = myField.selectionStart;
            var endPos = myField.selectionEnd;
            restoreTop = myField.scrollTop;

            myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);

            myField.selectionStart = startPos + myValue.length;
            myField.selectionEnd = startPos + myValue.length;

            if (restoreTop > 0) {
              myField.scrollTop = restoreTop;
            }
          }
          else {
            myField.value += myValue;
          }
        }

      function interceptTabs(evt, control) {
        key = evt.keyCode ? evt.keyCode : evt.which ? evt.which : evt.charCode;
        if (key == 9) {
          insertAtCursor(control, '\t');
          return false;
        }
        else {
          return key;
        }
      }

      function createHtmlList(input) {
        var output = "";

        var re = /\r\n|\n\r|\n|\r/g;
        arrayofLines = input.replace(re,"\n").split("\n");

        function prepareLine(input) {
          var i = 0;
          var output = "";
          if (document.frmConvert.chbRemovePrefix.checked) {
            var prefix = document.frmConvert.linePrefix.value;
            if (input.indexOf(prefix) === 0) {
              input = input.substring(prefix.length);
              // left-trim
              input = input.replace(/^\s+/,"");
            }
          }
          while (i < input.length) {
            switch (input[i]) {
              case '\"':
                output += "&quot;";
                break;
              case '&':
                output += "&amp;";
                break;
              case '<':
                output += "&lt;";
                break;
              case '>':
                output += "&gt;";
                break;
              default:
                output += input[i];
                break;
            }
            i++;
          }    
          return output;
        }

        var previousLevel = -1;
        for (index = 0; index < arrayofLines.length; ++index) {
          var line = arrayofLines[index];
          
          // count leading tab characters
          var newLevel = 0;
          var i = 0;
          while (i < line.length) {
            if (line[i] != '\t') {
              break;
            }
            newLevel++;
            i++;
          }
          
          // get rid of leading tabs
          line = line.substring(newLevel);
          line = prepareLine(line);

          if (newLevel > previousLevel) {
            if (previousLevel >= 0) {
              output += "\n";
            }
            output += Array(newLevel + 1).join("\t");
            output += "<ul>\n";
            output += Array(newLevel + 2).join("\t");
            output += "<li>";
            output += line;
            previousLevel = newLevel;
          } else if (newLevel == previousLevel) {
            output += "</li>\n";            
            output += Array(newLevel + 2).join("\t");
            output += "<li>";
            output += line;           
          } else {
            if (previousLevel > 0) {
              output += "</li>\n";
            }            
            while (previousLevel > newLevel) {            
              output += Array(previousLevel + 1).join("\t");
              output += "</ul>\n";
              output += Array(previousLevel + 1).join("\t");
              output += "</li>\n";              
              previousLevel--;              
            }
            output += Array(newLevel + 2).join("\t");
            output += "<li>";
            output += line;            
          }

        }

        if (previousLevel >= 0) {
          output += "</li>\n";
        }
        while (previousLevel >= 0) {
          output += Array(previousLevel + 1).join("\t");
          output += "</ul>\n";
          if (previousLevel > 0) {
            output += Array(previousLevel + 1).join("\t");
            output += "</li>\n";
          }
          previousLevel--;              
        }

        return output;
      }

      function Convert() {
        var output = createHtmlList(document.frmConvert.ed_input.value);
        document.frmConvert.ed_output.value = output;
      }

      function loadExample() {
        document.frmConvert.ed_input.value = "Item1\nItem2\n\tSubItem2_1\n\tSubItem2_2\nItem3";
      }

//-->
    </script>


<div id="main">

	<h1>Text -> HTML unordered list converter</h1>
	<p>Converting text list into nested unordered HTML list. Items in source text should be separated with new lines, number
		of leading tabs defines nesting level. Characters &quot;, &amp;, &lt; i &gt; are replaced with corresponding HTML
		entities.
	</p>
	<p>
		I'm using this for converting tab-formatted application changelogs into nested html lists.
	</p>
	<form name="frmConvert" action="">
		<p>
			<button type=button name="btnConvert" onclick="loadExample()">
				Example
			</button>
		</p>
		<p>Source text:</p>
		<p>
			<textarea onkeydown="return interceptTabs(event, this);" name="ed_input" rows="10" cols="67" style="width: 550px;"></textarea>
		</p>
		<p>
			<input type="checkbox" name="chbRemovePrefix">remove <input type="text" name="linePrefix" value="-" style="width: 50px;"> prefix from each line if present and left-trim         
		</p>
		<p>
			<button type=button name="btnConvert" onclick="Convert()">
				Convert
			</button>
		</p>
		<p>HTML output</p>
		<p>
			<textarea name="ed_output" rows="12" cols="67" style="width: 550px;"></textarea>
		</p>
	</form>
  </div>
<div id="sidebar">
<h3>Sitemap</h3>

<ul id="tree0" class="tree">

    <li ><a>PROJECTS</a>
    <ul>
    <li><A HREF="../programator.htm" TARGET="_self">FLASH 49F programmer</A></li> 
    </ul>
    </li>

 
    <li><a>ONLINE TOOLS</a>
    <ul>
    <li><a href="./base64.htm" TARGET="_self">Base64 -&gt; HEX</A></li>
    <li><a href="./base32.htm" TARGET="_self">Base32 -&gt; HEX</a></li>
    <li><a href="./base32hex.htm" TARGET="_self">Base32hex -&gt; HEX</a></li>
    <li><a href="./ascii.htm" TARGET="_self">ASCII -&gt; HEX</a></li>
    <li><a href="./ascii_uN.htm" TARGET="_self">ASCII -&gt; u16/u32/u64 HEX</a></li>            
    <li><a href="./hex_to_base64.htm" TARGET="_self">HEX -&gt; Base64</a></li>
    <li><a href="./text_to_base64.htm" TARGET="_self">Text -&gt; Base64</a></li>
    <li><a href="./hex_to_base32.htm" TARGET="_self">HEX -&gt; Base32</a></li>
    <li><a href="./hex_to_base32hex.htm" TARGET="_self">HEX -&gt; Base32hex</a></li>
    <li><a href="./hex_to_ascii.htm" TARGET="_self">HEX -&gt; ASCII</a></li>
    <li><a href="./hex_to_dec.htm" TARGET="_self">HEX -&gt; DEC</a></li>	
    <li><a href="./dec_to_ascii.htm" TARGET="_self">DEC -&gt; ASCII</a></li>
    <li><a href="./bin_to_32bit_hex.htm" TARGET="_self">BIN &lt;-&gt; 32-bit hex</a></li>    
    <li><a href="./md5.htm" TARGET="_self">MD5 calculator</a></li>
    <li><a href="./sha1.htm" TARGET="_self">SHA1 calculator</a></li>    
    <li><a href="./regexp.htm" TARGET="_self">Regular exp.</a></li>
    <li><a href="./cpp_text_escape.htm" TARGET="_self">Text -&gt; Cpp</a></li>
    <li><a href="./cpp_unescape.htm" TARGET="_self">Cpp -&gt; text</a></li>
    <li><a href="./pascal_escape.htm" TARGET="_self">Text -&gt; Pascal</a></li>        
    <li><a href="./hex_to_file.htm" TARGET="_self">HEX -&gt; file</a></li>
    <li><a href="./file_to_hex.htm" TARGET="_self">File -&gt; HEX</a></li>
    <li><a href="./file_to_base64.htm" TARGET="_self">File -&gt; Base64</a></li>    
    <li><a href="./html_list_gen.htm" TARGET="_self">Text -&gt; HTML ul</a></li>
    <li><a href="./crc8.htm" TARGET="_self">CRC8</a></li>
    <li><a href="./wave_gen.htm" TARGET="_self">WAVE generator</a></li>
    <li><a href="./bin_decoder.htm" TARGET="_self">Bin decoder</a></li>
    <li><a href="./rc4.htm" TARGET="_self">RC4</a></li>          
    <li><a href="./xor.htm" TARGET="_self">XOR</a></li>
    <li><a href="./inv.htm" TARGET="_self">Inverting bits</a></li>
    <li><a href="./par_resistors.htm" TARGET="_self">Par. resistors search</a></li>
    <li><a href="./unique_str.htm" TARGET="_self">Deduplicate / sort</a></li>        
    <li><a href="./base64_to_PEM.htm" TARGET="_self">Base64 -&gt; PEM</a></li>
    <li><a href="./PEM_to_base64.htm" TARGET="_self">PEM -&gt; base64</a></li>
    <li><a href="./diskstats.htm" TARGET="_self">/proc/diskstats</a></li>    
    </ul>
    </li> 


    <li><A HREF="../contact2.htm" TARGET="_self">Contact</A></li></ul>
<script type="text/javascript">
//<!--
new tree("tree0");
//-->
</script>

<br>  
<br>  
<br>  





  <br>    

        
    
</div>


<div id="footer">




  
</div>


<br>
<div id="footer2"><p>      
            <!-- <font size="-2">&nbsp;"Cookie monsters": 5583818&nbsp;&nbsp;&nbsp;&nbsp;Parse time:&nbsp;0.000 s</font> -->

  </p>
	</div>
</div>
</body>
</html>

